//
//  ViewController.m
//  03-sqlite
//
//  Created by HM on 16/2/25.
//  Copyright © 2016年 HM. All rights reserved.
//

#import "ViewController.h"
#import <sqlite3.h>

@interface ViewController ()
{
    // 添加成员变量.
    sqlite3 *_db;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 数据库: sqlite3
    // 

}

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    NSLog(@"touchesBegan");
    
    // 1. 打开数据库
    // const char *filename:文件路径;沙盒 Caches
    // sqlite3 **ppDb :数据库实例.
    
    NSString *filePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
    
    filePath = [NSString stringWithFormat:@"%@/itcast.sqlite3",filePath];
    
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        
        NSLog(@"%@",filePath);
    });

    int result = sqlite3_open(filePath.UTF8String, &_db);
    
    if (result == SQLITE_OK) {
        
        NSLog(@"数据库打开成功!");
        
        // 建表:
        [self createTable];
        
        
        
        
    }else
    {
        NSLog(@"数据库打开失败!");
    }
    
    
}

// 建表.
- (void)createTable
{
    // 执行 sql 语句
    
    const char *sql ="CREATE TABLE IF NOT EXISTS t_student (id integer primary key autoincrement ,name text, age integer ,score real);";
    // const char *sql :需要执行的 sql 语句
    
    char *errorMsg = NULL;
    
    int result = sqlite3_exec(_db, sql, NULL, NULL, &errorMsg);
    
    if (result == SQLITE_OK) {
        
        NSLog(@"表创建成功!");
        // 插入数据
        // [self inserData];
        
        // 查询数据
        [self selectData];
        
        
    }else
    {
        NSLog(@"表创建失败! %s",errorMsg);
    }
}


// 查询数据!
- (void)selectData
{
    // 1.查询语句的 sql 语句
    const char *sql = "SELECT name , age ,score  FROM t_student  WHERE age > 50 LIMIT 10,10;";
    
    sqlite3_stmt *stmt; // 用来存放查询到的数据内容的!
    
    // 2.检查 sql 语句的合法性!
    // int nByte :查询SQL语句的长度! 一般 传 -1,会自动计算长度!
    int result = sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL);
    
    if (result == SQLITE_OK) {
        
        // 查询语句合法!
        NSLog(@"查询语句合法!");
        
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            NSLog(@"查询到一行数据");
            
            // 从查询到的这行数据中,取出对应的字段内容!
            // 根据需要查询数据的字段类型,选择对应的查询函数
            // int iCol: 第几列数据
            const unsigned char *name = sqlite3_column_text(stmt, 0);
            int age = sqlite3_column_int(stmt, 1);
            double score = sqlite3_column_double(stmt, 2);
            
            
            NSLog(@"name: %s age: %d score :%f",name,age, score);
            
            // 包装字典/字典转模型...
        }
        
    }else
    {
        NSLog(@"查询语句不合法!");
    }
    
}


// 查询一行数据
- (void)testWithStmt:(sqlite3_stmt *)stmt
{
    // 查看是都查询到一行数据
    int result = sqlite3_step(stmt);
    
    if (result == SQLITE_ROW) {
        
        NSLog(@"查询到一行数据");
        
        // 从查询到的这行数据中,取出对应的字段内容!
        // 根据需要查询数据的字段类型,选择对应的查询函数
        // int iCol: 第几列数据
        const unsigned char *name = sqlite3_column_text(stmt, 0);
        
        NSLog(@"name: %s",name);
        
        int age = sqlite3_column_int(stmt, 1);
        NSLog(@"age: %d",age);
        
        double score = sqlite3_column_double(stmt, 2);
        NSLog(@"score :%f",score);
        
    }else
    {
        NSLog(@"没有查询到数据");
    }
}





// 删除和更新数据,使用和 插入式同样的函数,自己下去测试!

// 插入数据
- (void)inserData
{
    // 执行 sql 语句
    // 批量插入数据
    
//    const char *sql ="INSERT INTO t_student (name ,age ,score) values ('zhangsan' ,18 ,90);";
    
    for (int i = 0 ; i < 100; i++) {
        
        NSString *name = [NSString stringWithFormat:@"zhang%d",i];

        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student (name ,age ,score) values ('%@' ,%d ,%d);",name,i,100-i];
        
        // const char *sql :需要执行的 sql 语句
        
        char *errorMsg = NULL;
        
        int result = sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errorMsg);
        
        if (result == SQLITE_OK) {
            
            NSLog(@"数据插入成功!");
            
        }else
        {
            NSLog(@"数据插入失败! %s",errorMsg);
        }
    }
 }




@end
